package com.example.housekeeping.service.impl;

import com.example.housekeeping.ex.ServiceException;

import com.example.housekeeping.pojo.entity.Comment;
import com.example.housekeeping.pojo.entity.Message;
import com.example.housekeeping.pojo.dto.MessageAddNewDTO;
import com.example.housekeeping.pojo.dto.MessageUpdateDTO;
import com.example.housekeeping.pojo.vo.CommentListItemVO;
import com.example.housekeeping.pojo.vo.CommentStandardVO;
import com.example.housekeeping.pojo.vo.MessageListItemVO;
import com.example.housekeeping.pojo.vo.MessageStandardVO;
import com.example.housekeeping.mapper.MessageMapper;
import com.example.housekeeping.service.MessageService;
import com.example.housekeeping.web.ServiceCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 留言表(Message)表服务实现类
 *
 * @author bob
 * @since 2023-03-20 19:36:07
 */
@Slf4j
@Service
public class MessageServiceImpl implements MessageService {
    @Autowired
    private MessageMapper messageMapper;

    /**
     * 新增数据
     *
     * @param messageAddNewDTO 实例对象
     */
    @Override
    public void addNew(MessageAddNewDTO messageAddNewDTO) {
        //查询是否存在同样的内容，如果存在则抛出，
        Message countByContent = new Message();
        countByContent.setContent(messageAddNewDTO.getContent());

        long count = messageMapper.count(countByContent);
        if (count > 1) {
            String message = "不好意思，你已经留言过了";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERROR_CONFLICT, message);
        }


        //创建Message对象
        Message Message = new Message();
        BeanUtils.copyProperties(messageAddNewDTO, Message);
        // 调用Mapper对象的insert()执行插入评论数据
        log.debug("即将执行插入数据，参数：{}", Message);
        messageMapper.insert(Message);
    }


    /**
     * 通过主键删除数据
     *
     * @param id 主键
     */
    @Override
    public void deleteById(Long id) {
        //查询是否存在评论，如果不存在抛出异常
        MessageStandardVO standardById = messageMapper.getStandardById(id);
        if (standardById == null) {
            String message = "删除留言不存在，";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERROR_NOT_FOUND, message);
        }
        // 调用Mapper对象的deleteById()方法执行删除
        log.debug("即将执行删除，参数：{}", id);
        messageMapper.deleteById(id);
    }

    /**
     * 修改数据
     *
     * @param messageUpdateDTO 实例对象
     * @return 实例对象
     */
    @Override
    public void updateById(Long id, MessageUpdateDTO messageUpdateDTO) {
        log.debug("开始处理【修改详情】的业务，ID：{}，新数据：{}", id, messageUpdateDTO);
        //查询修改内容与原来的是否一致，是抛出
        Message countByContent=new Message();
        countByContent.setContent(messageUpdateDTO.getContent());
        long count = messageMapper.count(countByContent);
        if (count > 0) {
            String message = "修改失败，修改内容与原来一致！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERROR_CONFLICT, message);
        }
        //查询是否存在数据，如果不存在抛出异常
        MessageStandardVO standardById = messageMapper.getStandardById(id);
        if (standardById == null) {
            String message = "修改评论不存在，";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERROR_NOT_FOUND, message);
        }

        //创建Message对象
        Message Message = new Message();
        BeanUtils.copyProperties(messageUpdateDTO, Message);
        Message.setId(id);
        // 调用Mapper对象的insert()执行修改评论数据
        log.debug("即将执行修改数据，参数：{}", Message);
        messageMapper.update(Message);
    }

    /**
     * 通过ID查询单条数据
     *
     * @param id 主键
     * @return 实例对象
     */
    @Override
    public MessageStandardVO getStandardById(Long id) {
        log.debug("开始处理【根据id查询详情】的业务，参数：{}", id);
        MessageStandardVO standardById = messageMapper.getStandardById(id);
        if (standardById == null) {
            String message = "查询失败，尝试访问的数据不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERROR_NOT_FOUND, message);
        }
        return standardById;
    }

    /**
     * 查询列表数据
     *
     * @return 实例对象
     */
    @Override
    public List<MessageListItemVO> list() {
        log.debug("开始处理【查询评论列表】的业务，无参数");
        List<MessageListItemVO> list = messageMapper.list();
        return list;
    }

}
